package com.berchen.阻塞与非阻塞;

import org.junit.Test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

/**
 * 程序运行，不能结束，因为服务器不知道客户端是否发送数据完毕。
 * 解决办法：
 *      1、告诉服务端发送完毕：sChannel.shutdownOutput();
 *      2、将线程变成非阻塞式。
 *
 */
public class TestBlock1 {

    // 客户端
    @Test
    public void client() throws IOException {

        SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 10006));
        FileChannel inScannel = FileChannel.open(
                Paths.get("D:\\JavaProject\\Project\\All_Project\\Others_Project\\JavaNIO\\src\\1.jpg"),
                StandardOpenOption.READ);

        ByteBuffer buf = ByteBuffer.allocate(1024);

        while(inScannel.read(buf)!=-1){

            buf.flip();
            sChannel.write(buf);
            buf.clear();
        }
        // 告诉客户端发送完毕
        sChannel.shutdownOutput();

        // 接收服务器端的反馈
        int len=0;
        while ((len=sChannel.read(buf))!=-1){
            buf.flip();
            System.out.println(new String(buf.array(),0,len));
        }

        inScannel.close();
        sChannel.close();
    }
    // 服务端
    @Test
    public void server() throws IOException {

        ServerSocketChannel ssChannel =ServerSocketChannel.open();
        FileChannel outChannel = FileChannel.open(
                Paths.get("D:\\JavaProject\\Project\\All_Project\\Others_Project\\JavaNIO\\src\\wangluo.jpg"),
                StandardOpenOption.WRITE,
                StandardOpenOption.READ,
                StandardOpenOption.CREATE);

        ssChannel.bind(new InetSocketAddress(10006));

        SocketChannel sChannel = ssChannel.accept();

        ByteBuffer buf = ByteBuffer.allocate(1024);

        while (sChannel.read(buf)!=-1){

            buf.flip();
            outChannel.write(buf);
            buf.clear();
        }

        // 发送反馈给客户端
        buf.put("您好，我收到了".getBytes());
        buf.flip();
        sChannel.write(buf);

        sChannel.shutdownOutput();

        ssChannel.close();
        outChannel.close();
        sChannel.close();
    }
}
